package com.boil.qz.safekavass.web.controller;

import com.boil.pojo.Page2Vo;
import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.model.LoginUser;
import com.boil.qz.safekavass.model.ReportRes;
import com.boil.qz.safekavass.pojo.ReportResVo;
import com.boil.qz.safekavass.service.ReportResService;
import com.boil.qz.safekavass.web.request.param.*;
import com.boil.util.Constants;
import com.boil.util.OkBaseController;
import com.boil.util.Page2;
import com.boil.util.Utils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;
import java.util.Date;

/**
 * Created by ChenYong on 2017-04-24.
 * <br>
 * 举报 Controller。
 */
@Controller("reportResController1")
@RequestMapping("/web/report")
public class ReportResController extends OkBaseController {
    /**
     * 注入举报 Service
     */
    @Autowired
    private ReportResService reportResService;

    /**
     * 举报列表页面。
     *
     * @param model 模型
     * @return 举报列表页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/list.html")
    public String listHtml(Model model) {
        return "/report/list";
    }

    /**
     * 添加举报页面。
     *
     * @param model 模型
     * @return 添加举报页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/add.html")
    public String addHtml(Model model) {
        return "/report/add";
    }

    /**
     * 获取举报列表 json。
     *
     * @param model  模型
     * @param param  举报列表的请求参数
     * @param errors 请求参数的校验结果
     * @return 举报列表 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/list.json")
    @ResponseBody
    public ResultVo listJson(Model model, @Valid ReportResListParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 查询分页实例
        Page2<ReportResVo> page2 = Utils.getPage2(request, param, Constants.ID_STR);
        page2.getParams().put("reportCreatePerson", param.getReportCreatePerson());
        page2.getParams().put("reportHandlePerson", param.getReportHandlePerson());
        page2.getParams().put("reportName", param.getReportName());
        page2.getParams().put("reportSource", param.getReportSource());
        page2.getParams().put("reportResult", param.getReportResult());
        page2.getParams().put("reportCreateStartDate", param.getReportCreateStartDate());
        page2.getParams().put("reportCreateEndDate", param.getReportCreateEndDate());
        page2.getParams().put("reportHandleStartDate", param.getReportHandleStartDate());
        page2.getParams().put("reportHandleEndDate", param.getReportHandleEndDate());
        page2.getParams().put("reportCreatePersonPhone", param.getReportCreatePersonPhone());

        // 分页查询
        reportResService.findInPage(page2);

        // 获取 DataTables 专用分页映射实例
        Page2Vo<ReportResVo> page2Vo = Utils.getPage2Vo(param, page2);

        resultVo.setResult(page2Vo);

        return resultVo;
    }

    /**
     * 添加举报。
     *
     * @param model  模型
     * @param param  添加举报的请求参数
     * @param errors 请求参数的校验结果
     * @return 重定向到举报列表页面--->“redirect:/report/list.html”
     */
    @RequestMapping(method = RequestMethod.POST, value = "/add.html")
    public String add(Model model, @Valid AddReportResParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取登录用户
        LoginUser loginUser = getLoginUser();
        // 创建举报实例
        ReportRes reportRes = new ReportRes();
        reportRes.setReportCreatePerson(param.getReportCreatePerson());
        reportRes.setReportName(param.getReportName());
        reportRes.setReportContent(param.getReportContent());
        reportRes.setReportSource(param.getReportSource());
        reportRes.setReportImages(param.getReportImages());
        reportRes.setReportResult(Constants.REPORT_RESULT_1);
        reportRes.setReportCreateTime(new Date());

        // 保存举报
        reportResService.saveReportRes(loginUser.getId(), reportRes);

        return "redirect:/web/report/list.html";
    }

    /**
     * 获取举报详细页面。
     *
     * @param model  模型
     * @param param  ID 参数
     * @param errors 请求参数的校验结果
     * @return 举报详细页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/detail.html")
    public String detailHtml(Model model, @Valid IdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取举报
        ReportRes reportRes = reportResService.findById(param.getId());

        // 美化内容
        if (StringUtils.isNotBlank(reportRes.getReportContent())) {
            reportRes.setReportContent(reportRes.getReportContent()
                    .replaceAll(Constants.CONTENT_NEWLINE_RN_RE, Constants.CONTENT_NEWLINE_BR_SPAN)
                    .replaceAll(Constants.CONTENT_NEWLINE_N_RE, Constants.CONTENT_NEWLINE_BR_SPAN)
                    .replaceAll(Constants.CONTENT_NEWLINE_BR_SPAN_RE, Constants.CONTENT_NEWLINE_BR_SPAN)
                    .replaceAll(Constants.CONTENT_NEWLINE_SHIT_RE, Constants.EMPTY_STR));
        }

        resultVo.setResult(reportRes);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/report/detail";
    }

    /**
     * 根据举报 ID 更新举报结果。
     *
     * @param model  模型
     * @param param  更新举报的请求参数
     * @param errors 请求参数的校验结果
     * @return 结果 json
     */
    @RequestMapping(method = RequestMethod.POST, value = "/update.json")
    @ResponseBody
    public ResultVo updateJson(Model model, @Valid UpdateReportResParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取登录用户
        LoginUser loginUser = getLoginUser();

        reportResService.updateById(loginUser.getId(), param.getId(), param.getReportResult());

        return resultVo;
    }

    /**
     * 根据举报 ID 给举报人发微信普通红包的页面。
     *
     * @param model 模型
     * @return 举报人发微信普通红包的页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/sendredpack.html")
    public String sendredpackHtml(Model model, @Valid IdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取举报
        ReportRes reportRes = reportResService.findById(param.getId());

        // 美化内容
        if (StringUtils.isNotBlank(reportRes.getReportContent())) {
            reportRes.setReportContent(reportRes.getReportContent()
                    .replaceAll(Constants.CONTENT_NEWLINE_RN_RE, Constants.CONTENT_NEWLINE_BR_SPAN)
                    .replaceAll(Constants.CONTENT_NEWLINE_N_RE, Constants.CONTENT_NEWLINE_BR_SPAN)
                    .replaceAll(Constants.CONTENT_NEWLINE_BR_SPAN_RE, Constants.CONTENT_NEWLINE_BR_SPAN)
                    .replaceAll(Constants.CONTENT_NEWLINE_SHIT_RE, Constants.EMPTY_STR));
        }

        resultVo.setResult(reportRes);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/report/sendredpack";
    }

    /**
     * 根据举报 ID 给举报人发微信普通红包。
     *
     * @param model  模型
     * @param param  举报微信发普通红包的请求参数
     * @param errors 请求参数的校验结果
     * @return 结果 json
     */
    @RequestMapping(method = RequestMethod.POST, value = "/sendredpack.json")
    @ResponseBody
    public ResultVo sendredpackJson(Model model, @Valid ReportWeixinSendredpackParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();
        // 获取登录用户
        LoginUser loginUser = getLoginUser();

        // 处理微信发普通红包
        reportResService.doSendredpack(resultVo, loginUser.getId(), param);

        return resultVo;
    }
}